#ifndef NETLIB_SOCKET_H
#define NETLIB_SOCKET_H

// 文件描述符类，RAII技法封装

#include "noncopyable.h"

// struct tcp_info is in <netinet/tcp.h>
struct tcp_info;

namespace netlib
{

namespace net
{

class InetAddress;

class Socket : noncopyable // 文件描述符类，RAII技法封装，不可拷贝
{
public:
    explicit Socket(int sockfd) : sockfd_(sockfd)
    { }

    ~Socket();

    int fd() const { return sockfd_; } // 返回持有的描述符fd

    bool getTcpInfo(struct tcp_info*) const; // 获取TCP相关信息

    bool getTcpInfoString(char* buf, int len) const; // 获取TCP相关信息并将其转化成字符串

    void bindAddress(const InetAddress& localaddr); // 调用自己封装的bind

    void listen(); // 调用自己封装的listen

    int accept(InetAddress* peeraddr); // 调用自己封装的accept

    void shutdownWrite(); // 调用自己封装的shutdown

    void setTcpNoDelay(bool on); // 禁用Nagle算法，可以避免连续发包出现延迟，对于低延迟服务很重要

    void setReuseAddr(bool on); // 设置地址重复利用，端口复用

    void setReusePort(bool on);

    void setKeepAlive(bool on); // 定期检测连接是否存在，应用层有心跳机制则无需设置该函数

private:
    const int sockfd_;      // 该对象持有的描述符

}; // class Socket end

} // namespace net end

} // namespace netlib end

#endif